package com.shujia.bigdata.map;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo3Rect {
    public static void main(String[] args) throws Exception {


        /**
         * 在java语音中，万物皆对象
         *
         * 类对象：java虚拟机在启动的时候会将所有java文件加载到内存中
         * 类对象中保存了类的属性，方法和构造函数
         *
         * Class类的一个对象
         *
         *
         * s  是Student类的对象
         *
         *
         * 反射：可以通过反射获取类的属性，方法，和构造函数
         *
         * 构造函数：可以用来创建对象
         * 方法：可以调用，(需要依赖类的对象）
         *
         */

        Student s = new Student();

        /**
         * 获取类对象的方法
         * 三种方式
         */

        //1、通过类名获取
        Class<Student> studentClass = Student.class;

        //2、通过类的对象获取
        Class aClass = s.getClass();

        System.out.println(aClass == studentClass);

        //3、通过类全名获取
        Class aClass1 = Class.forName("com.shujia.bigdata.map.Score");

        System.out.println(aClass1 == aClass);

        /**
         * 通过类对象创建类的对象
         *
         */

        //调用类的无参构造函数
        Object o = aClass1.newInstance();
        //调用对象的toString方法
        System.out.println(o);

        /**
         * 通过获取类的构造函数创建对象
         *
         */

        //无参构造函数的对象
        Constructor constructor = aClass1.getConstructor();

        Object o1 = constructor.newInstance();

        System.out.println(o1);

        //获取有参构造函数
        Constructor constructor1 = aClass1.getConstructor(String.class, String.class, Integer.class);

        Object o2 = constructor1.newInstance("001", "200", 100);

        //出现类型转换异常
        // Student s1 = (Student) o2;

        System.out.println(o2);

        //获取类的属性
        /**
         * getDeclaredFields 获取所有属性
         * getFields  获取公共属性
         */
        Field[] fields = aClass1.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //获取的的方法
        Method[] methods = aClass1.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        //通过方法名和参数类型获取方法的对象
        Method method = aClass1.getMethod("setScore", Integer.class);

        Object o3 = aClass1.newInstance();

        method.invoke(o3, 100);

        System.out.println(o3);


    }
}
